package com.cros.utilities;

import java.util.Date;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


public class Ordenamiento {
	
	private static Log log = LogFactory.getLog(Ordenamiento.class);

	public static void ordenar(int[] arreglo) {
		int pasadas = 0;
		int comparaciones = 0;
		for (int i = 0; i < arreglo.length; i++) {
			++pasadas;
			for (int j = 0; j < arreglo.length - 1; j++) {
				++comparaciones;
				if (arreglo[j] > arreglo[j + 1]) {
					intercambiar(arreglo, j, j + 1);
				}
			}
		}
		estadisticas(pasadas, comparaciones);
	}
	
	
	public static void ordenar(Date[] arreglo) {
		int pasadas = 0;
		int comparaciones = 0;
		for (int i = 0; i < arreglo.length; i++) {
			++pasadas;
			for (int j = 0; j < arreglo.length - 1; j++) {
				++comparaciones;
				if (arreglo[j] .after( arreglo[j + 1])) {
					intercambiar(arreglo, j, j + 1);
				}
			}
		}
		estadisticas(pasadas, comparaciones);
	}

	public static void ordenarMejorado(int[] arreglo) {
		int pasadas = 0;
		int comparaciones = 0;
		boolean hayCambios = true;
		for (int i = 0; hayCambios; i++) {
			++pasadas;
			hayCambios = false;
			for (int j = 0; j < arreglo.length - 1; j++) {
				++comparaciones;
				if (arreglo[j] > arreglo[j + 1]) {
					intercambiar(arreglo, j, j + 1);
					hayCambios = true;
				}
			}
		}
		estadisticas(pasadas, comparaciones);
	}
	
	public static void ordenarMejorado(Date[] arreglo) {
		int pasadas = 0;
		int comparaciones = 0;
		boolean hayCambios = true;
		for (int i = 0; hayCambios; i++) {
			++pasadas;
			hayCambios = false;
			for (int j = 0; j < arreglo.length - 1; j++) {
				++comparaciones;
				if (arreglo[j] .after(arreglo[j + 1])) {
					intercambiar(arreglo, j, j + 1);
					hayCambios = true;
				}
			}
		}
		estadisticas(pasadas, comparaciones);
	}

	private static void intercambiar(int[] arreglo, int a, int b) {
		int tmp = arreglo[a];
		arreglo[a] = arreglo[b];
		arreglo[b] = tmp;
	}

	private static void intercambiar(Date[] arreglo, int a, int b) {
		Date tmp = arreglo[a];
		arreglo[a] = arreglo[b];
		arreglo[b] = tmp;
	}
	
		
	private static void estadisticas(int pasadas, int comparaciones) {
		log.info("Pasadas ordenamiento: " + pasadas);
		log.info("Comparaciones ordenamiento: " + comparaciones);
	}
}
